PROJECT(HELLO)

ADD_SUBDIRECTORY(src src_bin)
# ADD_SUBDIRECTORY 语法 ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 用于向当前工程中添加存放源文件的子目录source_dir（子目录中也需要有CMakeLists.txt文件）
# 并可以指定中间二进制和目标二进制存放的位置binary_dir
# EXCLUDE_FROM_ALL 参数是指将这个目录从编译过程中排除，例如一般的example工程，需要在整个工程编译完成house单独编译
# 例如上述例子，就是将src目录加入到工程中，并将其编译过程中产生的中间二进制、目标二进制文件，放在src_bin目录下
# 【注意】在本例子中，在src的CMakeLists.txt中定义了EXECUTABLE_OUTPUT_PATH变量，因此目标二进制文件会生成在
# EXECUTABLE_OUTPUT_PATH 目录下，具体请参考上述文件

# SUBDIRS(src)
# 对应的有SUBDIRS命令SUBDIRS(dir1 dir2...)，可以一次添加多个子目录，但是子目录的编译结果也会放在构建目录下的同名子目录下
# 例如 SUBDIRS(src) 则hello文件生成在src目录，这里推荐使用ADD_SUBDIRECTORY

# 安装目标二进制文件hello 到bin目录
INSTALL(TARGETS hello
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic)

# 安装COPYRIGHT README文件 到doc/cp 目录
INSTALL(FILES COPYRIGHT README DESTINATION doc/cp)
# 安装runhello.sh
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
# 安装 doc中的hello.txt 文件 到doc 目录
# 可以在doc下建立CMakeLists文件然后通过ADD_SUBDIRECTORY实现，但是推荐使用INSTALL DIRECTORY
# 这里只把hello.txt安装到目标路径而不是整个路径，所以使用doc/将目录本身排除在外
INSTALL(DIRECTORY doc/ DESTINATION doc)

# 通过设定CMAKE_INSTALL_PREFIX参数，配置整个工程的安装路径
# cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..


# 关于安装
# 安装分为两种 第一类是编译后直接使用make install进行安装  第二类是打包时指定安装目录
# 在make install 时，可以通过设置DESTDIR指定安装的目录，例如 make install DESTDIR=/tmp/test
# 此外，目录相关的还有PREFIX，Makefile中通过指定PREFIX来设置统一的前缀目录
# Makefile中，安装的目录路径一般为 $(DESTDIR)/$(PREFIX)/<开发者定义的目录>

# CMAKE中关于安装的指令是INSTALL，以及执行中加入的变量 CMAKE_INSTALL_PREFIX，常见的使用方法是
# cmake -DCMAKE_INSTALL_PREFIX=/usr ..
# CMAKE_INSTALL_PREFIX 的默认位置是/usr/local

# INSTALL 用于定义安装的规则，安装的内容可以包括目标二进制、动态库、经态度、以及文件、目录、脚本等

# 目标文件安装
# INSTALL(
#  TARGETS targets...  # 这里跟着的是通过 ADD_EXECUTABLE 或者 ADD_LIBRARY 定义的目标文件，可能是可执行二进制、动态库、静态库
#     [
#       [ARCHIVE|LIBRARY|RUNTIME] # 目标类型有三种，ARCHIVE特指静态库，LIBRARY特指动态库，RUNTIME特指可执行目标二进制
#       [DESTINATION <dir>] # DESTINATION定义了安装的路径，如果路径以/开头，那么指的是绝对路径，CMAKE_INSTALL_PREFIX就无效了
#                           # 不以/开头，那么安装后的路径就是${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>
#       [PERMISSIONS permissions...]
#       [CONFIGURATIONS[Debug|Release|...]]
#       [COMPONENT <component>]
#       [OPTIONAL]
#     ]
#     [...]
# )
# 例子：
# INSTALL(TARGETS myrun mylib mystaticlib
# RUNTIME DESTINATION bin
# LIBRARY DESTINATION lib
# ARCHIVE DESTINATION libstatic)
# 上面的例子会将：
# 可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
# 动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
# 静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录

# 普通文件安装
#INSTALL(
#        FILES files... # 这里不使用TARGET 而使用FILES
#        DESTINATION <dir>
#        [PERMISSIONS permissions...] # 定义文件的权限，如果不定义默认是644权限 OWNER_WRITE, OWNER_READ,  GROUP_READ,和WORLD_READ
#        [CONFIGURATIONS [Debug|Release|...]]
#        [COMPONENT <component>]
#        [RENAME <name>]
#        [OPTIONAL]
#)

# 非目标文件的可执行文件安装（例如脚本等）
#INSTALL(
#        PROGRAMS files...
#        DESTINATION <dir>
#        [PERMISSIONS permissions...] # 默认755 OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE
#        [CONFIGURATIONS [Debug|Release|...]]
#        [COMPONENT <component>]
#        [RENAME <name>]
#        [OPTIONAL]
#)

# 目录安装
#INSTALL(
#        DIRECTORY dirs...  # 所在Source的绝对路径，注意abc与abc/是不同的，目录不以/结尾，这个目录将被安装位目标路径下的abc，
#                           # 如果以/结尾，讲这个目录中的内容安装到目标路径，【不包含目录本身】
#        DESTINATION <dir>
#        [FILE_PERMISSIONS permissions...]
#        [DIRECTORY_PERMISSIONS permissions...]
#        [USE_SOURCE_PERMISSIONS]
#        [CONFIGURATIONS [Debug|Release|...]]
#        [COMPONENT <component>]
#        [
#               [PATTERN <pattern> | REGEX <regex>] # 用于使用正则表达式进行过滤
#               [EXCLUDE]
#               [PERMISSIONS permissions...] # 用于指定PATTERN过滤后的文件权限
#         ]
#        [...]
#)
# 例子
#INSTALL(
#        DIRECTORY icons scripts/
#        DESTINATION share/myproj
#        PATTERN "CVS" EXCLUDE
#        PATTERN "scripts/*" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READGROUP_EXECUTE GROUP_READ
#)
# 执行结果为：
# 将icons目录安装到<prefix>/share/myproj，将scripts/中【的内容】安装到<prefix>/share/myproj
# 不包含目录名为CVS的目录，
# 对于scripts/*文件指定权限为OWNER_EXECUTEOWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ.

# 安装时CMAKE脚本的执行
#INSTALL(
#        [
#            [SCRIPT <file>] # 用于在安装时调用cmake脚本文件（也就是<abc>.cmake文件）
#            [CODE <code>] # 用于执行CMAKE指令，必须以双引号括起来。比如：INSTALL(CODE "MESSAGE(\"Sample install message.\")")
#        ]
#        [...]
#)















